package util //type conversion 类型转换
// Bytes = []byte
// UX = uintX
// IX = intX
//~BE = Big-Endian
//~LE = Little-Endian
//大字节序: (Big-Endian)高位字节排放在内存的低地址端，低位字节排放在内存的高地址端。
//小字节序: (Little-Endian)低位字节排放在内存的低地址端，高位字节排放在内存的高地址端。

//
func BytesToU16(b []byte, isBE bool) (i uint16) {
	if isBE {
		return BytesToU16BE(b)
	}
	return BytesToU16LE(b)
}

//
func BytesToU32(b []byte, isBE bool) (i uint32) {
	if isBE {
		return BytesToU32BE(b)
	}
	return BytesToU32LE(b)
}

//
func BytesToU8(b []byte) (i uint8) {
	i = b[0]
	return
}

//
func BytesToU16BE(b []byte) (i uint16) {
	i = uint16(b[0])
	i <<= 8
	i |= uint16(b[1])
	return
}

func BytesToU16LE(b []byte) (i uint16) {
	i = uint16(b[1])
	i <<= 8
	i |= uint16(b[0])
	return
}

//
func BytesToI16BE(b []byte) (i int16) {
	i = int16(b[0])
	i <<= 8
	i |= int16(b[1])
	return
}

//
func BytesToI24BE(b []byte) (i int32) {
	i = int32(int8(b[0]))
	i <<= 8
	i |= int32(b[1])
	i <<= 8
	i |= int32(b[2])
	return
}

//
func BytesToU24BE(b []byte) (i uint32) {
	i = uint32(b[0])
	i <<= 8
	i |= uint32(b[1])
	i <<= 8
	i |= uint32(b[2])
	return
}

//
func BytesToI32BE(b []byte) (i int32) {
	i = int32(int8(b[0]))
	i <<= 8
	i |= int32(b[1])
	i <<= 8
	i |= int32(b[2])
	i <<= 8
	i |= int32(b[3])
	return
}

//
func BytesToU32LE(b []byte) (i uint32) {
	i = uint32(b[3])
	i <<= 8
	i |= uint32(b[2])
	i <<= 8
	i |= uint32(b[1])
	i <<= 8
	i |= uint32(b[0])
	return
}

//
func BytesToU32BE(b []byte) (i uint32) {
	i = uint32(b[0])
	i <<= 8
	i |= uint32(b[1])
	i <<= 8
	i |= uint32(b[2])
	i <<= 8
	i |= uint32(b[3])
	return
}

//
func BytesToU40BE(b []byte) (i uint64) {
	i = uint64(b[0])
	i <<= 8
	i |= uint64(b[1])
	i <<= 8
	i |= uint64(b[2])
	i <<= 8
	i |= uint64(b[3])
	i <<= 8
	i |= uint64(b[4])
	return
}

//
func BytesToU64BE(b []byte) (i uint64) {
	i = uint64(b[0])
	i <<= 8
	i |= uint64(b[1])
	i <<= 8
	i |= uint64(b[2])
	i <<= 8
	i |= uint64(b[3])
	i <<= 8
	i |= uint64(b[4])
	i <<= 8
	i |= uint64(b[5])
	i <<= 8
	i |= uint64(b[6])
	i <<= 8
	i |= uint64(b[7])
	return
}

//
func BytesToI64BE(b []byte) (i int64) {
	i = int64(int8(b[0]))
	i <<= 8
	i |= int64(b[1])
	i <<= 8
	i |= int64(b[2])
	i <<= 8
	i |= int64(b[3])
	i <<= 8
	i |= int64(b[4])
	i <<= 8
	i |= int64(b[5])
	i <<= 8
	i |= int64(b[6])
	i <<= 8
	i |= int64(b[7])
	return
}

//=====================================================================

//
func U8ToBytesBE(i uint8, b []byte) {
	b[0] = i
}

//
func I16ToBytesBE(i int16, b []byte) {
	b[0] = byte(i >> 8)
	b[1] = byte(i)
}

//
func U16ToBytesBE(i uint16, b []byte) {
	b[0] = byte(i >> 8)
	b[1] = byte(i)
}

//
func I24ToBytesBE(i int32, b []byte) {
	b[0] = byte(i >> 16)
	b[1] = byte(i >> 8)
	b[2] = byte(i)
}

//
func U24ToBytesBE(i uint32, b []byte) {
	b[0] = byte(i >> 16)
	b[1] = byte(i >> 8)
	b[2] = byte(i)
}

//
func I32ToBytesBE(i int32, b []byte) {
	b[0] = byte(i >> 24)
	b[1] = byte(i >> 16)
	b[2] = byte(i >> 8)
	b[3] = byte(i)
}

//
func U32ToBytesBE(i uint32, b []byte) {
	b[0] = byte(i >> 24)
	b[1] = byte(i >> 16)
	b[2] = byte(i >> 8)
	b[3] = byte(i)
}

//
func U32ToBytesLE(i uint32, b []byte) {
	b[3] = byte(i >> 24)
	b[2] = byte(i >> 16)
	b[1] = byte(i >> 8)
	b[0] = byte(i)
}

//
func U40ToBytesBE(i uint64, b []byte) {
	b[0] = byte(i >> 32)
	b[1] = byte(i >> 24)
	b[2] = byte(i >> 16)
	b[3] = byte(i >> 8)
	b[4] = byte(i)
}

//
func U48ToBytesBE(i uint64, b []byte) {
	b[0] = byte(i >> 40)
	b[1] = byte(i >> 32)
	b[2] = byte(i >> 24)
	b[3] = byte(i >> 16)
	b[4] = byte(i >> 8)
	b[5] = byte(i)
}

//
func U64ToBytesBE(i uint64, b []byte) {
	b[0] = byte(i >> 56)
	b[1] = byte(i >> 48)
	b[2] = byte(i >> 40)
	b[3] = byte(i >> 32)
	b[4] = byte(i >> 24)
	b[5] = byte(i >> 16)
	b[6] = byte(i >> 8)
	b[7] = byte(i)
}

//
func I64ToBytesBE(i int64, b []byte) {
	b[0] = byte(i >> 56)
	b[1] = byte(i >> 48)
	b[2] = byte(i >> 40)
	b[3] = byte(i >> 32)
	b[4] = byte(i >> 24)
	b[5] = byte(i >> 16)
	b[6] = byte(i >> 8)
	b[7] = byte(i)
}
